package com.micro.balance;

import java.util.Map;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

/**
 * 负载均衡上下文类，用于动态选择负载均衡策略
 * 实现了ApplicationContextAware接口，以便Spring容器设置应用上下文
 */
@Component
public class LoadBalanceContext implements ApplicationContextAware{

	/**
	 * 从配置文件中注入负载均衡策略的名称
	 */
	@Value("${loadbalance}")
	private String loadbalance;

	/**
	 * 应用上下文，用于获取Bean实例
	 */
	private ApplicationContext applicationContext;

	/**
	 * 根据提供的映射选择一个负载均衡的实现
	 *
	 * @param map 包含负载均衡策略名称和权重的映射
	 * @return 返回选择的服务实例标识
	 */
	public String select(Map<String,Integer> map){
		// 根据配置的负载均衡策略名称获取对应的Bean实例
		Object obj = applicationContext.getBean(loadbalance);
		if (obj != null) {
			// 将获取到的Bean实例转换为ILoadBalance接口类型，并调用其select方法
			ILoadBalance lb = (ILoadBalance) obj;
			return lb.select(map);
		}
		return null;
	}

	/**
	 * 设置应用上下文，由Spring容器调用
	 *
	 * @param applicationContext 应用上下文
	 * @throws BeansException 如果设置过程中出现错误
	 */
	@Override
	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
		this.applicationContext = applicationContext;
	}

}
